為什麼今天標題這麼正常?
這個子標題聽起來好像很有power。
其實只是在實作按鈕點擊變化之前,我想先來講講如何指定按鈕的action。
上一篇文章有講到,建立button實體的方法,有從library裡拖拉button至storyboard,也有用程式碼實踐2種。
如果是從library拖拉的,需要使用@IBAction在程式碼裡指定button的回饋動作:
@IBAction func buttonAction(_ sender: UIButton) {
//任何你想要button做的事>///<
}
這時你會看到@IBACtion前面有一個空心圓:
將空心圓拖拉至storyboard裡的button,就完成了連結。
如果button是用程式碼建立的話,則要先建立一個button回饋動作的function:
@objc func buttonAction(_ sender: UIButton) {
//任何你想要button做的事>///<
}
再將你的button加入這個function(target):
newButton.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
其中for是一個UIEvent,決定了使用者對button進行怎樣的操作才會回饋動作。
一般都是touchUpInside,指的是使用者點擊按鈕後,在按鈕的內部移開手指後觸發動作。其他還有很多好玩的UIEvent,如果有機會再跟大家介紹。
接下來進入正題,來談談button的state。
state是表示button目前的狀態。如果沒有做任何設定,按鈕的state會是default(對應UIControl.state為normal)。當按鈕被選取時,狀態會從normal變成highlighted。
而常見的點擊後會變化的按鈕就是利用給normal和highlighted時不同的設定來實現的。現在來實作一個簡單的例子。初始化button後,在viewDidLoad()的function裡加入下列程式碼:
//按鈕狀態為normal時,內容為normal,字體顏色白色
newButton.setTitle("normal", for: .normal)
newButton.setTitleColor(UIColor.white, for: .normal)
//按鈕狀態為highlighted時,內容為highlighted,字體顏色紅色
newButton.setTitle("highlighted", for: .highlighted)
newButton.setTitleColor(UIColor.red, for: .highlighted)
而按鈕的狀態如果為selected,一開始就會呈現被選取的狀態,點擊時則是取消選取,state會變回normal。
//設定按鈕的初始望態為selected
newButton.isSelected = true
newButton.setTitle("selected", for: .selected)
newButton.setTitleColor(UIColor.blue, for: .selected)
這樣看起來,按鈕狀態一開始設為normal跟設為selected,做出來的效果好像差不多。
那selected到底是來幹嘛用的呢?
其實button的回饋動作還有一個很常見的應用:check list,可以讓按鈕點擊後轉換成被選取的狀態,同時切換不同的圖片及title。
以下有個簡單的小實例,建立一個切換selected的function:
@objc func switchSelected(_ sender: UIButton) {
sender.isSelected = !sender.isSelected
}
並加入newButton:
newButton.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)
其實這個順序是(初始)normal>(點擊)highlighted>(放開)selected>(再點擊)>(再放開)normal
可是錄gif的時候鼠標會不見啊~~我不知道怎麼顯示啊~~誰來救救我QQ
而按鈕的state若為disable,則會呈現無法被選取的狀態,可配合判斷式讓按鈕在某些條件下才可以被選取。常用的像是輸入資料時,如果沒有填進任何文字,送出資料的按鈕就無法被點選:
override func viewDidLoad() {
newButton.isEnabled = false
//為button指定一個action(function enterName),會在textField的內容被更動時觸發
nameTextField.addTarget(self, action: #selector(enterName), for: .editingChanged)
}
@objc func enterName(_ sender: UITextField) {
//若textField內為空字串,則按鈕無法被選取
if sender.text == "" {
newButton.isEnabled = false
} else {
newButton.isEnabled = true
}
}
那今天就到此為止,再講下去我的存貨就要不夠啦...
明天是UIButton的最終回,會介紹UIButton提供的一些特效以及支援功能。